package br.com.dallasmotopecas.comum.cliente.controller;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.ExternalContext;

import br.com.dallasmotopecas.comum.cliente.model.ClienteModel;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteAssociadoVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosDetalheVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosFinanceiroVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteDadosVo;
import br.com.dallasmotopecas.comum.cliente.vo.ClienteVo;
import br.com.dallasmotopecas.eptus.cliente.controller.ClienteEptusController;
import br.com.dallasmotopecas.util.controller.AbstractController;
import br.com.dallasmotopecas.util.data.ManipulacaoData;
import br.com.dallasmotopecas.util.exception.AlterarObjetoException;
import br.com.dallasmotopecas.util.exception.CampoObrigatorioException;
import br.com.dallasmotopecas.util.exception.ClasseNaoEncontradaException;
import br.com.dallasmotopecas.util.exception.ConexaoException;
import br.com.dallasmotopecas.util.exception.DeletarObjetoException;
import br.com.dallasmotopecas.util.exception.InserirObjetoException;
import br.com.dallasmotopecas.util.exception.ListarObjetoException;

public class ClienteController extends AbstractController
{	
	public ClienteController(ExternalContext externalContext) throws ClasseNaoEncontradaException, ConexaoException
	{
		super(externalContext);
	}
	
	public ClienteController(Connection connection) throws ConexaoException
	{
		super(connection);
	}
	
	public void processarCliente() throws ConexaoException, ListarObjetoException, AlterarObjetoException, InserirObjetoException, CampoObrigatorioException, DeletarObjetoException
	{
		List<ClienteVo> listaCliente = null;
		List<ClienteDadosVo> listaDados = null;
		List<ClienteDadosDetalheVo> listaDetalhadoDados = null;
		List<ClienteAssociadoVo> listaClienteAssociado = null;
		ClienteEptusController clienteEptusController = null;
		List<ClienteDadosFinanceiroVo> listaDadosTitulosVencidos = null;
		try
		{
			listaCliente  = new ArrayList<ClienteVo>();
			listaDados = new ArrayList<ClienteDadosVo>();
			listaDetalhadoDados = new ArrayList<ClienteDadosDetalheVo>();
			listaClienteAssociado = new ArrayList<ClienteAssociadoVo>();
			listaDadosTitulosVencidos = new ArrayList<ClienteDadosFinanceiroVo>();
			clienteEptusController = new ClienteEptusController(getConnection());
			clienteEptusController.processarClientesEptus(listaCliente, listaDetalhadoDados, listaDados, listaClienteAssociado, listaDadosTitulosVencidos);
			
			synchronized (ClienteVo.class)
			{
				beginTransaction();
				
				gravarListaCliente(listaCliente);
				
				gravarDadosCliente(listaDados);
				
				gravarDadosDetalheCliente(listaDetalhadoDados);
				
				gravarClientesAssociados(listaClienteAssociado);
				
				gravarDadosClienteFinanceiro(listaDadosTitulosVencidos);
				
				commit();
			}
		}
		catch(ConexaoException e)
		{
			throw e;
		}
		catch (ListarObjetoException e)
		{
			throw e;
		}
		catch (AlterarObjetoException e)
		{
			rollback();
			throw e;
		}
		catch (InserirObjetoException e)
		{
			rollback();
			throw e;
		}
		catch (CampoObrigatorioException e)
		{
			rollback();
			throw e;
		}
		catch (DeletarObjetoException e)
		{
			rollback();
			throw e;
		}
		finally
		{
			clienteEptusController = null;
			listaCliente = null;
			listaDados = null;
			listaDetalhadoDados = null;
			listaClienteAssociado = null;
			listaDadosTitulosVencidos = null;
		}
	}
	
	private void gravarListaCliente(final List<ClienteVo> listaCliente) throws AlterarObjetoException, InserirObjetoException
	{
		ClienteModel clienteModel = null;
		try
		{
			clienteModel = new ClienteModel(getConnection());
			
			for (int i = 0; i < listaCliente.size(); i++)
			{
				if (clienteModel.alterarCliente(listaCliente.get(i)) == 0)
					clienteModel.inserirCliente(listaCliente.get(i));
			}
		}
		catch (AlterarObjetoException e)
		{
			throw e;
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteModel = null;
		}
		
	}
	
	private void gravarDadosClienteFinanceiro(List<ClienteDadosFinanceiroVo> listaDadosTitulosVencidos) throws AlterarObjetoException, InserirObjetoException, ConexaoException, CampoObrigatorioException
	{
		ClienteDadosFinanceiroController clienteDadosFinanceiroController = null;
		try
		{
			clienteDadosFinanceiroController = new ClienteDadosFinanceiroController(getConnection());
			
			for (int i = 0; i < listaDadosTitulosVencidos.size(); i++)
			{
				clienteDadosFinanceiroController.gravarDados(listaDadosTitulosVencidos.get(i));
			}
		}
		catch (AlterarObjetoException e)
		{
			throw e;
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteDadosFinanceiroController = null;
		}
		
	}
	
	private void gravarDadosCliente(final List<ClienteDadosVo> listaDados) throws AlterarObjetoException, InserirObjetoException, ConexaoException, CampoObrigatorioException
	{
		ClienteDadosController clienteDadosController = null;
		try
		{
			clienteDadosController = new ClienteDadosController(getConnection());
			
			for (int i = 0; i < listaDados.size(); i++)
			{
				clienteDadosController.gravarDados(listaDados.get(i));
			}
		}
		catch (AlterarObjetoException e)
		{
			throw e;
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteDadosController = null;
		}
		
	}
	
	private void gravarDadosDetalheCliente(final List<ClienteDadosDetalheVo> listaDetalhadoDados) throws AlterarObjetoException, InserirObjetoException, ConexaoException, CampoObrigatorioException
	{
		ClienteDadosDetalheController clienteDadosDetalheController = null;
		try
		{
			clienteDadosDetalheController = new ClienteDadosDetalheController(getConnection());
			
			for (int i = 0; i < listaDetalhadoDados.size(); i++)
			{
				listaDetalhadoDados.get(i).setSemanaCompetencia(ManipulacaoData.getSemana(listaDetalhadoDados.get(i).getDataCompra()));
				clienteDadosDetalheController.gravarDadosDetalhe(listaDetalhadoDados.get(i));
			}
		}
		catch (AlterarObjetoException e)
		{
			throw e;
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteDadosDetalheController = null;
		}
		
	}
	
	private void gravarClientesAssociados(final List<ClienteAssociadoVo> listaClienteAssociado) throws ConexaoException, CampoObrigatorioException, DeletarObjetoException, InserirObjetoException
	{
		ClienteAssociadoController clienteAssociadoController = null;
		try
		{
			clienteAssociadoController = new ClienteAssociadoController(getConnection());
			clienteAssociadoController.deletarAssociados();
			for (int i = 0; i < listaClienteAssociado.size(); i++)
			{
				clienteAssociadoController.gravarAssociado(listaClienteAssociado.get(i));
			}
		}
		catch (DeletarObjetoException e)
		{
			throw e;
		}
		catch (InserirObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteAssociadoController = null;
		}
	}
	
	public void listarCliente(final List<ClienteVo> listaCliente, final ClienteVo clienteVo) throws ListarObjetoException, ConexaoException
	{
		ClienteModel clienteModel = null;
		try
		{
			if (listaCliente != null && clienteVo != null)
			{
				clienteModel = new ClienteModel(getConnection());
				listaCliente.addAll(clienteModel.getListaCliente(clienteVo));
			}
		}
		catch(ListarObjetoException e)
		{
			throw e;
		}
		finally
		{
			clienteModel = null;
		}
	}
}
